val hClass_1 = Human::class.java//获取Human类的class属性
val constructor_1 = hClass_1.getDeclaredConstructor(String::class.java)
val human_1=constructor_1.newInstance()
val hClass_2 = Human::class//获取Human类的Kclass属性
val allConstructors_2 = hClass_2.constructors
val constructor = allConstructors_2.stream().filter { it.parameters.size == 1 }.findAny().get().javaConstructor
val human_2=constructor.newInstance()
调用类的方法
通过class对象或者kclass对象获取指定的method方法,返回method类型的对象,调用该method对象中的invoke(Object obj,Object…args)方法来调用函数方法,第一个参数对应调用该方法的实例对象,第二个参数对应该方法的参数,可以传递多个参数。
val hClass_1 = Human::class.java//获取Human类的class属性
val human_1=hClass_1.newInstance() as Human
val declareMethod_1 = hClass_1.getDeclaredMethod("say", String::class.java)
declareMethod_1.isAccessible = true//设置private私有方法可以访问
declareMethod_1.invoke(human_1, "Hello~!")
val hClass_2 = Human::class//获取Human类的Kclass属性
val human_2=hClass_2.createInstance()
val methods_2 = hClass_2.memberFunctions//获取class对象的所有的方法,包括父类的方法
val method_2 = methods_2.stream().filter { it.name == "say" }.findAny().get().javaMethod
method_2!!.isAccessible = true//设置private私有方法可以访问
method_2.invoke(human_2, "Bingo~")
访问成员变量值
通过class对象或者kclass获取指定的Field成员变量,返回Field类型的成员变量对象。Field提供了两组方法来读取或设置成员变量的值,通过get(Object obj)方法来获取指定obj对象实例的该成员变量的值,通过set(Object obj,XXX val)方法来设置指定obj对象实例的该成员变量的值为val值。PS:对于8种原生的基本数据类型,有相对应的优化方法,如getInt,getDouble,setInt,setDouble
val hClass_1 = Human::class.java//获取Human类的class属性
val human_1=hClass_1.newInstance() as Human
val code_1: Field = hClass_1.getField("code")
println(code_1.get(human_1))
code_1.set(human_1,"0000")
val hClass_2 = Human::class//获取Human类的Kclass属性
val human_2=hClass_2.createInstance()
val publicFields_2 = hClass_2.memberProperties
val nameField_2 = publicFields_2.stream().filter { it.name == "name" }.findAny().get().javaField
nameField_2!!.isAccessible = true
nameField_2.set(human_2, "JasonChen")
println(nameField_2.get(human_2))
|